<?php
//图像处理类
class Image {
	private $file;            //图片路径
	private $width;
	private $height;
	private $type;
	private $img;            //原图的资源句柄
	private $newImg;         //新图的资源句柄
	private $temp;

	public function __construct($file) {
		//把需要被处理的图像链接路径转换为图片硬路径
		$this->file = $file;
		//获取图片的宽、高、类型(type 1为gif,2为jpg,3为png)
		list($this->width,$this->height,$this->type) = getimagesize($this->file);
		//动态获取旧图像的资源句柄
		$this->img = $this->createNewImg($this->file,$this->type);
	}


	//等比例缩放，用于前台显示
	public function thumbAsSameScale($width=220,$height=220) {
	    $newBg = imagecreatetruecolor($width,$height);
	    imagecopyresampled($newBg,$this->img,0,0,0,0,$width,$height,$this->width,$this->height);
	    $start = substr($this->file,0,-strlen(strrchr($this->file,'.')));;
	    $end = strrchr($this->file,'.');
        $this->file = $start.'220x220'.$end;
	    imagepng($newBg,$this->file);
	    imagedestroy($newBg);
	    imagedestroy($this->img);
	}

	//缩略图(固定高度，使用等比例技术，扩容填充技术)，固定长高并能保持失真(一般采取这个方式)
	/**
	 *
	 * @param num $newWidth   固定图像的宽度
	 * @param num $newHeight	固定图像的高度
	 */
	public function thumb($newWidth = 0,$newHeight = 0) {
		//如果不传参数值，则把容器大小定义为源图像大小
		if(empty($newWidth) && empty($newHeight)) {
			$newWidth = $this->width;
			$newHeight = $this->height;
		}

		//如果传值不是数字，则把容器大小定义为源图像大小
		if(!is_numeric($newWidth) || !is_numeric($newHeight)) {
			$newWidth = $this->width;
			$newHeight = $this->height;
		}

		//创建一个固定宽高的容器,本网站是150  x 100
		$nW = $newWidth;
		$nH = $newHeight;

		//裁剪点初始化
		$cutHeight = 0;
		$cutWidth = 0;

		//对比原图宽和高，如果原图宽大于高，则让高按照宽的缩放比例进行缩放，反之亦然(原则：原图宽和高哪个数值大，哪个就做主)
		if($this->width < $this->height) {
			$newWidth = ($newHeight / $this->height) * $this->width;
		} else {
			$newHeight = ($newWidth / $this->width) * $this->height;
		}

		//扩容填充
		/*
		 * 原理：如果图像的宽或高经过缩放后没有能够达到容器的宽和高的值，那么就再次对他们就行缩放
		 * 缩放的大小决定于第一次缩放后图像宽或高两者，谁的大小没有达到容器的宽或高大小，那么就让其容器的宽/高 除以 没有达到容器数值的宽/高 = 第二次缩放的等比例因子$r
		 * 得到等比例因子后，再对第一次缩放的图像同时乘以获得的等比例因子，相当于第二次等比例缩放
		 * 缩放后，图像可能会处于最前端或者最顶端，那么我们可以通过一条固定公式去计算得一个裁剪点，最后通过裁剪得到稍为理想的图像
		 */
		if($newWidth < $nW) {
			$r = $nW / $newWidth;
			$newWidth = $newWidth * $r;
			$newHeight = $newHeight * $r;
			$cutHeight = ($newHeight - $nH) / 2;       //固定公式，记住即可
		}
		if($newHeight < $nH) {
			$r = $nH / $newHeight;
			$newWidth = $newWidth * $r;
			$newHeight = $newHeight * $r;
			$cutWidth = ($newWidth - $nW) / 2;       //固定公式，记住即可
		}
		//创建150 x 100的容器画布
		$this->newImg = imagecreatetruecolor($nW,$nH);
		imagecopyresampled($this->newImg,$this->img,0,0,$cutWidth,$cutHeight,$newWidth,$newHeight,$this->width,$this->height);
	}

	//ckeditor上传图片专用处理方法(设置图片水印)
	/**
	 * @param num $newWidth        //限制的最大宽度(本网站是650)
	 * @param num $newHeight	   //限制的最大高度(不限制)
	 */
	public function ckImg($newWidth = 0,$newHeight = 0) {

		//如果不传参数值，则把容器大小定义为源图像大小
		if(empty($newWidth) && empty($newHeight)) {
			$newWidth = $this->width;
			$newHeight = $this->height;
		}

		//如果传值不是数字，则把容器大小定义为源图像大小
		if(!is_numeric($newWidth) || !is_numeric($newHeight)) {
			$newWidth = $this->width;
			$newHeight = $this->height;
		}

		//获取水印图片的宽高
		list($waterWidth,$waterHeight,$waterType) = getimagesize(MARK);

		//获取水印图像资源句柄
		$waterImg = $this->createNewImg(MARK,$waterType);

		//如果原图片超过最大宽度或高度，则做如下处理
		if($this->width > $newWidth) {
			$newHeight = ($newWidth / $this->width) * $this->height;
		//否则等于图片原高度
		} else {
			$newWidth = $this->width;
			$newHeight = $this->height;
		}
		if($this->height > $newHeight) {
			$newWidth = ($newHeight / $this->height) * $this->width;
		} else {
			$newWidth = $this->width;
			$newHeight = $this->height;
		}

		//水印坐标
		$waterX = $newWidth - $waterWidth - 5;
		$waterY = $newHeight - $waterHeight - 5;

		//创建以newWidth为宽度，以newHeight为高度的容器
		$this->newImg = imagecreatetruecolor($newWidth,$newHeight);
		//把源图像的图片copy到新图的画布中
		imagecopyresampled($this->newImg,$this->img,0,0,0,0,$newWidth,$newHeight,$this->width,$this->height);
		//把水印图片复制到缩略图中
		//为了防止水印图像比缩略图像大，假设源图像比水印图小，就不再加水印了
		if($this->width > $waterWidth && $this->height > $waterHeight) {
			imagecopy($this->newImg,$waterImg,$waterX,$waterY,0,0,$waterWidth,$waterHeight);
		}
		//输出缩略后的图像
		imagedestroy($waterImg);
	}

	//动态创建新图像
	private function createNewImg($file,$type) {
		switch($type) {
			case 1 :
				$img = imagecreatefromgif($file);
				break;
			case 2 :
				$img = imagecreatefromjpeg($file);
				break;
			case 3 :
				$img = imagecreatefrompng($file);
				break;
			default:
				exit('警告：此图片类型不合法!');
		}
		return $img;
	}

	//图像输出
	public function output() {
		//处理过的新图像覆盖了之前上传过来的图像
		imagepng($this->newImg,$this->file);
		imagedestroy($this->img);
		imagedestroy($this->newImg);
	}

	//获取缩略图的地址
	public function getThumbPath() {
	    return $this->file;
	}

}


?>